/* 
 * Copyright 2010 Ziya Guven Koylu, Ozge Koylu
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at 
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package com.koylu.caffein.query.filter;

import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.koylu.caffein.model.caffein.CaffeinConfig;
import com.koylu.caffein.model.clazz.Clazz;

public class And extends CompositeFilter{
	
	private List<Filter> filters;
	private StringBuffer query = null;
	
	public And() {}
	
	public And(Filter[] filterArr) {
		if(filters == null){
			filters = new ArrayList<Filter>(5);
		}
		filters.addAll(Arrays.asList(filterArr));
	}
	
	public And addFilter(Filter filter){
		if(filters == null){
			filters = new ArrayList<Filter>(5);
		}
		filters.add(filter);
		query = null;
		return this;
	}
	
	public List<Filter> getFilters() {
		return filters;
	}
	
	public StringBuffer toQuery(CaffeinConfig caffeinConfig, Map<String, Clazz> aliasMap) throws Exception {
		if(query == null){
			query = new StringBuffer();
			if(filters != null){
				if( filters.size() > 0 ){
					query.append("(");
					for (Iterator<Filter> iterator = filters.iterator(); iterator.hasNext();) {
						query.append(iterator.next().toQuery(caffeinConfig, aliasMap));
						if (iterator.hasNext()) {
							query.append(" AND ");
						}
					}
					query.append(")");
				}				
			}
		}
		return query;
	}
	
	public int fieldToColumn(CaffeinConfig caffeinConfig, PreparedStatement preparedStatement, int index) throws Exception {
		if(filters != null){
			for (Filter filter : filters) {
				index = filter.fieldToColumn(caffeinConfig, preparedStatement, index);
			}			
		}
		return index;
	}
	
	public void resolveValue(Object object) throws Exception {
		if(filters != null){
			for (Filter filter : filters) {
				filter.resolveValue(object);
			}
		}
	}
}